package com.example.venue_reservation_service.utils;
import org.springframework.util.DigestUtils;

import java.security.SecureRandom;
import java.util.regex.Pattern;

public class MD5Util {

    /**
     * MD5+随机盐
     * 1、生成随机盐,UUID可以保证全局唯一，即可实现每个用户的盐都不一样
     * 2、密码拼接盐值
     * 3、生成密文，把密文和盐都存数据库
     * 4、判断的时候，取出数据库盐值，密码拼接盐值，生成密文，取出数据库密文校验
     * 5、若一致则正确，否则不正确
     */
    public static String md5(String password , String salt){
        // MD5随机盐加密
        return  DigestUtils.md5DigestAsHex((password+salt).getBytes());
    }

    public static String generateRandomString(int minLength) {
        // 确保生成的字符串长度至少为 minLength
        int length = minLength + new SecureRandom().nextInt(10); // 随机生成一个大于等于 minLength 的长度

        // 定义字符集：包含大小写字母、数字和特殊字符
        String uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
        String numbers = "0123465789";
        String specialChars = "!@#$%^&*()_+-=[]{}|;':,.<>?";

        // 合并所有字符集
        String allChars = uppercaseLetters + lowercaseLetters + numbers + specialChars;

        // 创建一个 SecureRandom 实例以生成更安全的随机数
        SecureRandom random = new SecureRandom();
        StringBuilder sb = new StringBuilder();

        // 确保生成的字符串中至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符
        sb.append(uppercaseLetters.charAt(random.nextInt(uppercaseLetters.length())));
        sb.append(lowercaseLetters.charAt(random.nextInt(lowercaseLetters.length())));
        sb.append(numbers.charAt(random.nextInt(numbers.length())));
        sb.append(specialChars.charAt(random.nextInt(specialChars.length())));

        // 填充剩余的字符
        for (int i = 4; i < length; i++) {
            sb.append(allChars.charAt(random.nextInt(allChars.length())));
        }

        // 将字符串打乱以确保随机性
        char[] chars = sb.toString().toCharArray();
        for (int i = 0; i < chars.length; i++) {
            int randomIndex = random.nextInt(chars.length);
            char temp = chars[i];
            chars[i] = chars[randomIndex];
            chars[randomIndex] = temp;
        }

        return new String(chars);
    }

    public static boolean validateString(String input) {
        // 检查字符串长度是否大于10
        if (input == null || input.length() <= 10) {
            return false;
        }

        // 检查是否包含大写字母
        boolean hasUpperCase = Pattern.compile("[A-Z]").matcher(input).find();
        // 检查是否包含小写字母
        boolean hasLowerCase = Pattern.compile("[a-z]").matcher(input).find();
        // 检查是否包含数字
        boolean hasDigit = Pattern.compile("[0-9]").matcher(input).find();
        // 检查是否包含特殊字符（这里假设特殊字符为非字母数字的字符）
        boolean hasSpecialChar = Pattern.compile("[^A-Za-z0-9]").matcher(input).find();

        // 所有条件都满足时返回true
        return hasUpperCase && hasLowerCase && hasDigit && hasSpecialChar;
    }
}
